#!/usr/bin/env python
# -*-coding: utf-8 -*-
# Filename: crear_clasificacion_ticket.py

##
# Módulos del sistema
# Parte gráfica
try:
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
except ImportError, error:
    print error
    print "Necesitas la librería gráficas gtk+pygtk"

##
# Módulos propios
try:
    from gui.msj_retroalimentacion import MensajeDeAdvertencia, MensajeDeError
    from gui.msj_retroalimentacion import MensajeDeNotificacion
    from lib.database import Clasificacion, GrupoDeResolucion
    from lib.funciones_utiles import close, add_find_column, descripcion_valida
except ImportError, error:
    print error
    print "Error en create_clasificacion_ticket "
class CrearClasificacionTicket:
    def __init__(self, padre):
        self.gladefile = "gui/ghhp.glade"
        self.wTree = gtk.glade.XML(self.gladefile, "CrearClasificacionTicket")
        self.window = self.wTree.get_widget("CrearClasificacionTicket")
        self.window.resize(700,500)
        #Establecemos el padre: !!!FIXME
        self.padre = padre
        self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
        self.window.set_transient_for(self.padre.window)

        self.un_dict = {"on_button117_clicked": self.agregar_grupo,
                "on_button118_clicked": self.quitar_grupo,
                "on_button76_clicked": self.verificar_datos,
                "on_button84_clicked": self.close,
                "on_button82_clicked": self.close,
                "on_button81_clicked": self.registrar_clasificacion}
        self.wTree.signal_autoconnect(self.un_dict)
        # Cajas contenedoras
        self.hbox_127 = self.wTree.get_widget("hbox127")
        self.hbox_128 = self.wTree.get_widget("hbox128")
        # Formamos cabeceras de las listas
        self.clasificaciones_existentes = self.wTree.get_widget("treeview35")
        self.grupos_activos_tree = self.wTree.get_widget("treeview34")
        self.grupos_asociados_tree = self.wTree.get_widget("treeview18")
        self.tree_view_20 = self.wTree.get_widget("treeview20")
        self.armar_listas_resultado()
        # Clasificaciones
        self.lista_clasificacion = gtk.ListStore(str, str)
        self.clasificaciones_existentes.set_model(self.lista_clasificacion)
        # Grupos
        # Activos
        self.lista_grupos_activos = gtk.ListStore(str, str)
        self.grupos_activos_tree.set_model(self.lista_grupos_activos)
        # Asociados
        self.lista_grupos_asociados = gtk.ListStore(str, str)
        self.grupos_asociados_tree.set_model(self.lista_grupos_asociados)
        self.grupos_activos = []
        self.grupos_asociados = []
        self.nombres_clasificaciones_existentes = {}
        self.iterador_activo = {}
        self.iterador_asociado = {}
        self.armar_listas()

    def armar_listas_resultado(self):
        """Arma las cabeceras de los tree view"""
        tree_view = [self.clasificaciones_existentes, self.grupos_activos_tree,
                self.grupos_asociados_tree, self.tree_view_20]
        titulos = ["Codigo", "Nombre"]
        for tree in tree_view:
            for pos,titulo in enumerate(titulos):
                add_find_column(titulo, pos, tree)

    def agregar_grupo(self, widget):
        print "Agregar grupo"
        pos, seleccionado = self.un_grupo_seleccionado(1)
        if seleccionado:
            # Lo pasamos al de abajo y eliminamos uno arriba
            self.grupos_asociados.append(self.grupos_activos[pos])
            self.iterador_asociado[self.grupos_activos[pos].nombre]= (
                    self.lista_grupos_asociados.append(self.lista_grupos_activos[pos]))
            self.lista_grupos_activos.remove(self.iterador_activo[self.grupos_activos[pos].nombre])
            self.grupos_activos.remove(self.grupos_activos[pos])
            self.rearmar_grupos_activos()
        else:
            texto = "Debe seleccionar el Grupo a que quiere a la lista."
            msj = MensajeDeError(texto, self.window)
            msj.run()

    def rearmar_grupos_activos(self):
        self.iterador_activo = {}
        self.lista_grupos_activos.clear()
        for grupo in self.grupos_activos:
            self.iterador_activo[grupo.nombre]= self.lista_grupos_activos.append(
                    [grupo.id, grupo.nombre])

    def un_grupo_seleccionado(self, lista):
        """Permite comprobar si selecciono un grupo de la lista."""
        dic = {1: self.grupos_activos_tree,
                2: self.grupos_asociados_tree}
        model, path = dic[lista].get_selection().get_selected_rows()
        if path:
            pos, = path[0]
            return pos, True
        else:
            return "", False

    def quitar_grupo(self, widget):
        print "quiera grupo"
        pos, seleccionado = self.un_grupo_seleccionado(2)
        if seleccionado:
            print self.iterador_asociado
            self.grupos_activos.append(self.grupos_asociados[pos])
            self.lista_grupos_activos.append(self.lista_grupos_asociados[pos])
            self.lista_grupos_asociados.remove(self.iterador_asociado[self.grupos_asociados[pos].nombre])
            self.grupos_asociados.remove(self.grupos_asociados[pos])
            self.rearmar_grupos_asociados()
        else:
            error = ["Debe seleccionar un Grupo de la lista Grupos asociados",
                    "que quiere quitar de la lista."]
            msj = MensajeDeError("\n".join(error), self.window)
            msj.run()

    def rearmar_grupos_asociados(self):
        self.iterador_asociado = {}
        self.lista_grupos_asociados.clear()
        for grupo in self.grupos_asociados:
            self.iterador_asociado[grupo.nombre] = (
                    self.lista_grupos_asociados.append([grupo.id,
                        grupo.nombre]))

    def armar_listas(self):
        """Llenara los trewiew"""

        # Clasificaciones existentes
        clasificaciones = Clasificacion.select()
        for clasificacion in clasificaciones:
            self.lista_clasificacion.append([str(clasificacion.id),
                clasificacion.nombre])
            self.nombres_clasificaciones_existentes[clasificacion.nombre.lower()]=clasificacion.id
        # Grupos existentes
        grupos = GrupoDeResolucion.select()
        for grupo in grupos:
            self.iterador_activo[grupo.nombre]= self.lista_grupos_activos.append(
                    [grupo.id, grupo.nombre])
            self.grupos_activos.append(grupo)

    def verificar_datos(self, widget):
        print "crear"
        self.nombre = self.wTree.get_widget("entry89").get_text()
        self.descripcion = descripcion_valida(self.wTree.get_widget("textview14"))
        if self.grupos_asociados and self.nombre and self.descripcion:
            if self.nombre_valido(self.nombre):
                print self.nombre
                self.confirmar_registro()
            else:
                error = ["El nombre de la clasificacion es incorrecto.",
                        "La nueva clasificacion no puede tener el mismo",
                        "nombre que una clasificacion existente."]
                msj = MensajeDeError("\n".join(error), self.window)
                msj.run()
                self.wTree.get_widget("entry89").set_text('')
        else:
            error = ["Los campos:","\t-Grupos de Resolucion Asociados.",
                    "\t-Nombre.", "\t-Descripcion.","No pueden ser nulos"]
            msj = MensajeDeError("\n".join(error), self.window)
            msj.run()

    def nombre_valido(self, nombre):
        if self.nombres_clasificaciones_existentes.get(nombre.lower()):
            return False
        else:
            return True

    def close(self, widget):
        close(self.window)

    def confirmar_registro(self):
        self.hbox_127.hide()
        self.hbox_128.show()
        lista = self.nombres_clasificaciones_existentes.values()
        lista.sort()
        self.codigo = lista[-1] + 1
        self.wTree.get_widget("label441").set_text(str(self.codigo))
        self.wTree.get_widget("label442").set_text(self.nombre)
        self.wTree.get_widget("textview7").get_buffer().set_text(self.descripcion)
        #Grupos asociados
        self.lista_confirmacion = gtk.ListStore(str, str)
        self.tree_view_20.set_model(self.lista_confirmacion)
        for grupo in self.grupos_asociados:
            self.lista_confirmacion.append([grupo.id, grupo.nombre])
        self.window.resize(600, 250)

    def registrar_clasificacion(self, widget):
        print "Confirmo el registro"
        """
        self.padre.grupo_de_resolucion.crearClasificacion(self.nombre,
                       self.descripcion,
                       self.grupos_asociados)
        Al hacerlo de la forma anterior me da el siguiente error:
        Traceback (most recent call last):
  File "/home/nercof/Proyectos/ghhp/gui/create_clasificacion_ticket.py", line 236, in registrar_clasificacion
    self.grupos_asociados)
  File "/home/nercof/Proyectos/ghhp/lib/grupo_de_resolucion.py", line 35, in crearClasificacion
    nueva=Clasificacion(nombre=nombre, descripcion=descripcion, historial_de_clasificacion=None)
TypeError: __init__() got an unexpected keyword argument 'descripcion'
        """
        try:
            nueva = Clasificacion(nombre=self.nombre,
                        descripcion=self.descripcion,
                        historial_de_clasificacion=None)
            for grupo in self.grupos_asociados:
                nueva.addGrupoDeResolucion(grupo)
            #Creamos la clasificacion con éxito   
            texto = "La clasificacion fue creada con exito"
            msj = MensajeDeNotificacion(texto, self.window)
            msj.run()
            self.window.destroy()
        except TypeError, error:
            error = "No se pudo crear la clasificacion"
            msj = MensajeDeError(error, self.window)
            msj.run()


